﻿using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using Capa_Negocio.Gestionar_Instrumentos;
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Dominio;
using Capa_Negocio;

namespace Capa_TestingProyectsNegocios
{
    [TestFixture]
    public class Test_AdministracionInstrumentos
    {
        IApplicationContext Spring = null;
        IAdministrarInstrumentosMusicales Service = null;

        InstrumentosMusicales instrumentoCreado = null;
        TipoInstrumento tipoInstrumentoCreado = null;
        ModeloInstrumento modeloInstrumentoCreado  = null;
        MarcaInstrumento  marcaInstrumentoCreado= null;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            // Inicialización del contenedor de objetos de Spring.NET
            Spring = new XmlApplicationContext(
                "assembly://Studio7i/Studio7i/capaPersistencia.xml",
                "assembly://Studio7i/Studio7i/capaNegocio.xml"
                );
            // Obtención de la referencia al objeto "administracionSalaEnsayo"
            Service = (IAdministrarInstrumentosMusicales)Spring.GetObject("AdministrarInstrumentosMusicales");

            tipoInstrumentoCreado = ((ITipoInstrumento)Spring.GetObject("TipoInstrumentoDAO_NH")).Crear(
               new TipoInstrumento() { NombreTipoInstrumento="Guitarra", Estado=true });
            // Creación de un local de pruebas
            modeloInstrumentoCreado = ((IModeloInstrumento)Spring.GetObject("ModeloInstrumentoDAO_NH")).Crear(
                new ModeloInstrumento() { NombreModelo="cuadrado", Estado=true });

            marcaInstrumentoCreado = ((IMarcaInstrumento)Spring.GetObject("MarcaInstrumentoDAO_NH")).Crear(
             new MarcaInstrumento() { NombreMarca  = "Yamaha", Estado = true });
        }

        [Test]
        public void Test1_InscribirInstrumentosMusicales_DatosInsuficientes()
        {
            // Probamos que se lance la excepción porque pasamos "null" en características
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.InscribirInstrumentos(null, marcaInstrumentoCreado.CodigoMarca, modeloInstrumentoCreado.CodigoModelo,
                    tipoInstrumentoCreado.CodigoTipoInstrumento, "2011", 20.5M, "color negro", 20, true, true);
            });
        }

        [Test]
        public void Test2_InscribirInstrumento_Ok()
        {
            // Probamos que no exista error en la inscripción de la sala
            Assert.DoesNotThrow(delegate
            {
                instrumentoCreado = Service.InscribirInstrumentos("Guitarra" ,marcaInstrumentoCreado.CodigoMarca,modeloInstrumentoCreado.CodigoModelo,
                    tipoInstrumentoCreado.CodigoTipoInstrumento,"2011",20.5M,"color negro",20,true,true);
            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(instrumentoCreado);
            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(instrumentoCreado.CodigoInstrumento, 0);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(instrumentoCreado.NombreInstrumento, "Guitarra");
            Assert.AreEqual(instrumentoCreado.TipoInstrumento.CodigoTipoInstrumento, tipoInstrumentoCreado.CodigoTipoInstrumento);
            Assert.AreEqual(instrumentoCreado.ModeloInstrumento.CodigoModelo, modeloInstrumentoCreado.CodigoModelo);
            Assert.AreEqual(instrumentoCreado.MarcaInstrumento.CodigoMarca, marcaInstrumentoCreado.CodigoMarca);
            Assert.Greater(instrumentoCreado.CantidadInstrumentos, 0);
        }

        [Test]
        public void Test3_InscribirInstrumento_Repetido()
        {
            // Probamos que se lance la excepción de sala repetida colocando el mismo nombre y local
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.InscribirInstrumentos("Guitarra", marcaInstrumentoCreado.CodigoMarca, modeloInstrumentoCreado.CodigoModelo,
                    tipoInstrumentoCreado.CodigoTipoInstrumento, "2011", 20.5M, "color negro", 20, true, true);
            });
        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            ((IInstrumentoMusical)Spring.GetObject("InstrumentosMusicalesDAO_NH")).Eliminar(instrumentoCreado);

            // Eliminamos la sala inscrita
            ((ITipoInstrumento)Spring.GetObject("TipoInstrumentoDAO_NH")).Eliminar(tipoInstrumentoCreado);
            // Eliminamos el local de prueba creado inicialmente
            ((IModeloInstrumento)Spring.GetObject("ModeloInstrumentoDAO_NH")).Eliminar(modeloInstrumentoCreado);

            ((IMarcaInstrumento)Spring.GetObject("MarcaInstrumentoDAO_NH")).Eliminar(marcaInstrumentoCreado);

            // Cerramos el contenedor de Spring
            Spring.Dispose();
            Spring = null;
        }
    }
}
